﻿package org.in4j.compiler.sandbox;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

/**
 * 解释器模式有点像演算法中的个别击破解释的方式，对每一个父节点
 我们剖析出其中的子节点的组合，然后再交由子节点剖析,直接剖析到终端节点为止。
 让我们做一个小小的程式解释器,可以将自定义文法程式文件解释执行。程式的关键字只有PROGRAM、PRINT、SPACE、BREAK、LINEBREAK、REPEAT、END。
 PROGRAM是程式的开始，END是结尾。简单的例子为:
    PROGRAM
   PRINT dog SPACE
   PRINT is SPACE
   PRINT an SPACE
   PRINT animai
   END
程序会印出"dog is an animal",再一个例子:
<blockquote>
<pre>
 PROGRAM
    REPEAT 2
        LINEBREAK
        PRINT dog
        BREAK
    END
 END
</pre>
</blockquote>
程序会印出
 ------------------------------
 dog
 ------------------------------
 dog


*/
public class Client
{
	public static void main(String[] args)
	{
		try
		{
			String input = "d:\\Projectes\\JavaSpace\\in4jsearch\\sandbox\\org\\in4j\\compiler\\sandbox\\yourprogram.txt";
			if(args.length > 0) input = args[0];
			System.out.println("input==>" + input);
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(input),"UTF-8"));
			String text;
			while((text = reader.readLine()) != null)
			{
				System.out.println("text = \"" + text + "\"");
				Node node = new ProgramNode();
				node.parse(new Context(text));
				System.out.println("node = " + node);
				node.execute();
			}
		}
		catch(ArrayIndexOutOfBoundsException e)
		{
			System.err.println("Usage: java Main yourprogram.txt");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}